<?
class TimeObject
	{
		var $nHora;
		var $nMinutos;
		var $nSegundos;
	function TimeObject( $cValue = '' )
		{
			if ( $cValue ) 	$this->setValue( $cValue );
		}
	function setNow()
		{
			$this->nHora = intval(Date('h'));
			$this->nMinutos = intval(Date('i'));
			$this->nSegundos = intval(Date('s'));
		}
	function setValue ( $cValue )
		{
			$aHora = array();
			// Formato HH:MM o HH.MM
			if ( strpos($cValue,':') || strpos($cValue,'.') )
			{
				$aHora = split ( "[:|.]", $cValue );
			} else
			{
				// Formato HHMM o HMM o HH
				if ( strlen( $cValue ) == 4 )
				{
					$aHora[0] = substr($cValue , 0, -2);
					$aHora[1] = substr($cValue, -2);
				}elseif ( strlen( $cValue ) == 3 )
				{
					$aHora[0] = intval( substr($cValue, 0,1 ) );
					$aHora[1] = intval(substr($cValue, 1,2 ));
				}elseif ( strlen( $cValue ) <= 2 )
				{
					if ( intval( $cValue) > 23 ) 
					{
						$aHora[1] = intval( $cValue);
						$aHora[0] = 0;
					} else
					{
						$aHora[0] = intval( $cValue);
						$aHora[1] = 0;
					}
				}
			}
			if ( $aHora[0] >= 0 && $aHora[0] < 24 && $aHora[1] >= 0 && $aHora[1] < 60 && ( empty($aHora[2]) || $aHora[2] >= 0 && $aHora[2] < 60) )
			{
				list ( $this->nHora, $this->nMinutos , $this->nSegundos ) = $aHora ;
			}
		}
		// String con el formato tiene la siguiente estructura [G/g][:][i/s]
		// [0] [G]: 0-23, [g]: 0-12 am/pm
		// [1] [:] el separador entre hora y minutos y segundos [N] sin separador
		// [2] [i]: es hora tipo hh:mm ; [s]: es hh:mm:ss e [I]: es hora tipo h o h:mm en caso de tener minutos
	function getValue( $cOptions = 'G:i' )
		{
			if ( empty($this->nHora) && empty($this->nMinutos)  ) return '';
			$nHora = $this->nHora;
			$cSeparador = $cOptions[1] == 'N' ? '' : $cOptions[1] ;
			$cPM = "";
			if ( $cOptions[0] == 'g' && $this->nHora > 12 )
			{
				$nHora -= 12;
				$cPM = " pm";
			}
			if ( $cOptions[2] == 'I' )
			{
				$cReturn = $nHora ;
				if ( $this->nMinutos ) $cReturn .= $cSeparador . str_pad( $this->nMinutos, 2 , '0', STR_PAD_LEFT );
			} else $cReturn = str_pad( $nHora, 2 , '0', STR_PAD_LEFT ) . $cSeparador . str_pad( $this->nMinutos, 2 , '0', STR_PAD_LEFT );
			if ( $cOptions[2] == 's' )	$cReturn .= $cSeparador . str_pad( $this->nSegundos, 2 , '0', STR_PAD_LEFT );
			$cReturn .= $cPM;
			return $cReturn ;
		}
	function getSeconds()
		{
			return $this->nSegundos;
		}
	function getMinutes()
		{
			return $this->nMinutos;
		}
	function getHours()
		{
			return $this->nHora;
		}
	function add ( $cDatePart, $nNumero )
		{
			list ( $this->nHora , $this->nMinutos , $this->nSegundos  ) = split ( "[:|.]", $this->addTime( $cDatePart, $nNumero )  );
		}
	function addTime( $cDatePart, $nNumero )
		{
			switch( $cDatePart )
			{
				case 'h':
					$nFecha = mktime ( $this->nHora + $nNumero, $this->nMinutos, $this->nSegundos );
					break;
				case 'i':
					$nFecha = mktime ( $this->nHora , $this->nMinutos+ $nNumero, $this->nSegundos );
					break;
				case 's':
					$nFecha = mktime ( $this->nHora , $this->nMinutos, $this->nSegundos + $nNumero);
					break;
			}
			return date("H:i:s", $nFecha);
		}
	function timeDiff( $cDatePart, $cTime )
		{
			$aTiempo = split( "[:|.]", $cTime );
			//$nTiempo = mktime ( $aTiempo[0], $aTiempo[1], $aTiempo[2]);
			switch( strtolower($cDatePart) )
			{
				case 'h':
					$nDiferecia = $aTiempo[0] - $this->nHora;
					break;
				case 'i':
					$nDiferecia = ($aTiempo[0] - $this->nHora) * 60  + ($aTiempo[1] - $this->nMinutos);
					break;
				case 's':
					$nDiferecia = ($aTiempo[0] - $this->nHora) * 60  + ($aTiempo[1] - $this->nMinutos) * 60 + ($aTiempo[2] - $this->nSegundos);
					break;
			}
			return $nDiferecia;
		}
	function getDescription ()
		{
			return str_pad( $this->nHora, 2 , '0', STR_PAD_LEFT ) . ':'. str_pad( $this->nMinutos, 2 , '0', STR_PAD_LEFT );
		}
	}
?>